package com.qf.air.controller;

import com.qf.air.entity.Air;
import com.qf.air.service.AirService;
import com.qf.air.util.JSONUtil;
import com.qf.air.util.R;
import com.qf.air.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.validation.Valid;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: 维多利加
 * @Date: 2021/3/24 14:43
 */
@RestController
@RequestMapping(value = "/air")
@CrossOrigin(allowCredentials = "true")
public class AirController {

    @Autowired
    @Qualifier(value = "airServiceImpl")
    private AirService airService;


    @Autowired
    private RestTemplate restTemplate;

    /**
     * 查询空气质量信息
     * #请求路径和请求方式
     * GET		http://localhost:8080/air/list
     * # 请求参数
     * page = 当前页(int)
     * rows = 每页显示条数(int)
     * districtId = 区域的标识(int)
     */
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public ResultVO list(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(value = "limit", defaultValue = "5") Integer rows,
            Integer districtId,
            String monitoringStation,
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
            @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) throws IOException {
        //1. 封装数据
        Map parameters = new HashMap();
        parameters.put("page",page);
        parameters.put("rows",rows);
        parameters.put("districtId",districtId);
        parameters.put("monitoringStation",monitoringStation);
        parameters.put("startTime",startTime);
        parameters.put("endTime",endTime);

        //2. 调用es查询数据
        HttpHeaders header = new HttpHeaders();
        header.setContentType(MediaType.APPLICATION_JSON_UTF8);
        String parameter = JSONUtil.obj2JSON(parameters);
        HttpEntity httpEntity = new HttpEntity(parameter,header);

        // http://localhost:9200/search/findCount
        Long count = restTemplate.postForObject("http://localhost:9200/search/findCount", httpEntity, Long.class);
        // http://localhost:9200/search/findData
        String data = restTemplate.postForObject("http://localhost:9200/search/findData", httpEntity, String.class);

        //3. 封装数据返回
        return R.ok(JSONUtil.jsonArray2ListMap(data), count);
    }

    /**
     * 添加空气质量信息
     * # 请求路径和请求方式
     * POST	http://localhost:8080/air/add
     * # 请求参数
     * districtId = 区域标识（int）
     * monitoringTime = 检测日期（Date）
     * pm10 = pm10数值（int）
     * pm25 = pm2.5数值（int）
     * monitorStation = 监测站（String）
     */
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ResultVO add(@Valid Air air, BindingResult bindingResult) {
        /*
        采用JSR303规范的方式校验
        1.导入hibernate-validator依赖，版本太高，就会凉凉
        2.在实体类的属性上添加注解，指定校验的方式
        3.在controller方法接收参数的实体类前，追加@Valid，代表开启注解校验
        4.为了更方便给页面提示信息，在JSR303的注解后，追加message属性
        5.在接收参数的实体类后，追加BindingResult的形参，来接收参数校验的情况
         */
        if (bindingResult.hasErrors()) {
            //判断是否有参数未通过校验  有：true,没有：false
            //如果有参数未通过校验，获得具体的message属性信息
            String message = bindingResult.getFieldError().getDefaultMessage();
            return R.error(400, message);
        }

        airService.save(air);

        return R.ok();
    }

    /**
     * 删除空气质量信息
     * # 请求路径和请求方式
     * GET	http://localhost:8080/air/delete
     * # 请求参数
     * id = 1 （int）id值
     */
    @GetMapping("/delete")
    public ResultVO delete(Integer id) {
        if (id == null) {
            return R.error(400, "id必须传值，不能为空");
        }

        airService.deleteById(id);

        return R.ok();

    }

    /**
     * # 请求路径和请求方式
     * POST	http://localhost:8080/air/update
     * # 请求参数
     * id = 1 （int）id值
     * districtId = 区域标识（int）
     * monitoringTime = 检测日期（Date）
     * pm10 = pm10数值（int）
     * pm25 = pm2.5数值（int）
     * monitorStation = 监测站（String）
     */
    @PostMapping("/update")
    public ResultVO update(@Valid Air air, BindingResult bindingResult) {
        if (bindingResult.hasErrors() || air.getId() == null) {
            FieldError fieldError = bindingResult.getFieldError();
            String msg = null;
            if (fieldError == null) {
                msg = "id必须传值，岂能为空";
            } else {
                msg = fieldError.getDefaultMessage();
            }

            return R.error(400, msg);

        }
        airService.updateById(air);

        return R.ok();
    }


}
